home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / games / ippon / source.lzh / FuncEnemy / zako031.c < prev    next >
C/C++ Source or Header  |  2000-07-07  |  2KB  |  118 lines

  1. /* zako031.c 破壊すると炸裂弾を発射するザコ */
  2. #include <xsp2lib.h>
  3.  
  4. #include "../main.h"
  5. #include "../player.h"
  6. #include "../enemy.h"
  7. #include "../eshot.h"
  8. #include "../effect.h"
  9. #include "../psearch.h"
  10. #include "../sound.h"
  11.  
  12. #define PALET_MAIN    0x0600
  13.  
  14. #define SPEED_1        6    /* 速度 */
  15.  
  16.  
  17. /* 関数プロトタイプ宣言 */
  18. static short EnemyMoveZako031 (ENEMY *);
  19. static void EnemyFreeZako031 (ENEMY *);
  20.  
  21.  
  22. /* 初期化ルーチン */
  23. void EnemyAllocZako031 (ENEMY * p)
  24. {
  25.     if (player->x < 144)
  26.         p->lx = 144 * 65536 + p->lx;
  27.     else
  28.         p->lx = 144 * 65536 - p->lx;
  29.  
  30.     p->vx = xytable[SPEED_1][p->angle].x;
  31.     p->vy = xytable[SPEED_1][p->angle].y;
  32.  
  33.     p->pt = obj_zako03;
  34.     p->info = PALET_MAIN | PRIORITY_ZAKO;
  35.     p->angle = psearch (SHORT_LX, SHORT_LY);
  36.     p->hit_sx = 12;
  37.     p->hit_sy = 12;
  38.  
  39.     p->hp = 1;        /* 耐久力 */
  40.     p->damage = 0;
  41.     p->damage_mode = DAMAGE_THROUGH;
  42.  
  43.     p->func_enemy_move = EnemyMoveZako031;
  44.     p->func_enemy_free = EnemyFreeZako031;
  45.  
  46.     /* コア関連 */
  47.     p->core_info = PALET_CORE_RED | PRIORITY_ZAKO;
  48.     p->core_pt = sp_core;
  49.  
  50.     p->m_work = p->m_work2 = 0;
  51. }
  52.  
  53.  
  54.  
  55. /* 移動ルーチン */
  56. /* 返り値:非0なら消去 */
  57. static short EnemyMoveZako031 (ENEMY * p)
  58. {
  59.     /* 速度を足して上位ワード(固定整数部)だけ取り出す */
  60.     p->x = (p->lx += p->vx) >> 16;
  61.     p->y = (p->ly += p->vy) >> 16;
  62.  
  63.     switch (p->m_work) {
  64.     case 0:
  65.         if (p->m_work2++ > 30) {
  66.             p->m_work++;
  67.             p->m_work2 = 0;
  68.             p->m_work3 = 0;
  69.         }
  70.         break;
  71.     case 1:
  72.         if (p->m_work2++ > 30) {
  73.             p->m_work2 = 0;
  74.             p->angle = psearch (p->x, p->y);
  75.             p->vx = xytable[SPEED_1][p->angle].x;
  76.             p->vy = xytable[SPEED_1][p->angle].y;
  77.             if (p->m_work3++ > 3)
  78.                 p->m_work++;
  79.         }
  80.         break;
  81.     case 2:
  82.         /* 画面外に出たら消去 */
  83.         /* (画面左右から出た判定と上下から出た判定を1回ずつの比較で行っている) */
  84.         if ((SHORT_LX > 256 + 32) || (SHORT_LY > 256 + 32))
  85.             return (-1);    /* 消去 */
  86.         break;
  87.     }
  88.  
  89.  
  90.     /* もし前回ダメージを受けたなら */
  91.     if (p->damage) {
  92.         p->damage = 0;
  93.         EffectAlloc (EFFECT_EXPLZAKO, 0, p->x, p->y);    /* 爆発パターンを出現させる */
  94.         EffectAlloc (EFFECT_POINTS, points_table[p->shot_count], p->x, p->y);    /* 得点を出現させる */
  95.         SoundSetSE (SE_EXPL);    /* ザコ爆発音 */
  96.         return (-1);
  97.     }
  98.     xobj_set_st (p);    /* 表示 */
  99.  
  100.     /* コアの表示 */
  101.     p->core_x = p->x - 8;
  102.     p->core_y = p->y - 8;
  103.     xsp_set_st (&(p->core_x));
  104.  
  105.     return (0);
  106. }
  107.  
  108.  
  109. /* 消去ルーチン */
  110. static void EnemyFreeZako031 (ENEMY * p)
  111. {
  112.     short h;
  113.     unsigned char a = 0;
  114. #define SPEED_SHOT2_3 6
  115.     for (h = 0; h < 16; h++)
  116.         EshotAlloc (ESHOT_NRG23, SHORT_LX, SHORT_LY, SPEED_SHOT2_3, a += 16, 0);
  117. }
  118.